package com.spark.client.demo;

import com.spark.client.SparkClient;
import com.spark.client.config.SparkConfig;
import com.spark.client.exception.SparkClientException;
import com.spark.client.model.SparkResponse;
import com.spark.client.tool.SparkTool;
import com.spark.client.tool.ToolCallHandler;

import java.util.HashMap;
import java.util.Map;

/**
 * SparkClient 演示程序
 * 展示各种使用方式
 */
public class SparkClientDemo {
    
    public static void main(String[] args) {
        System.out.println("=== SparkClient 演示程序 ===");
        
        // 创建配置
        SparkConfig config = new SparkConfig();
        config.setApiKey("your-api-key-here"); // 请替换为真实的 API Key
        config.setModel("generalv3.5");
        config.setMaxTokens(4096);
        config.setTemperature(0.7);
        config.setEnableLogging(true);
        
        // 演示基本用法
        demonstrateBasicUsage(config);
        
        // 演示链式调用
        demonstrateBuilderPattern(config);
        
        // 演示工具调用
        demonstrateToolCalling(config);
        
        System.out.println("\n=== 演示完成 ===");
    }
    
    /**
     * 演示基本用法
     */
    private static void demonstrateBasicUsage(SparkConfig config) {
        System.out.println("\n--- 基本用法演示 ---");
        
        try {
            SparkClient client = new SparkClient(config);
            
            // 注意：这里只是演示 API 调用方式，实际运行需要有效的 API Key
            System.out.println("创建 SparkClient 成功");
            System.out.println("配置模型: " + client.getConfig().getModel());
            System.out.println("最大 Tokens: " + client.getConfig().getMaxTokens());
            
            // 如果有有效的 API Key，可以取消注释下面的代码
            // SparkResponse response = client.chat("你好，请介绍一下你自己");
            // System.out.println("AI 回复: " + response.getChoices().get(0).getMessage().getContent());
            
        } catch (Exception e) {
            System.out.println("基本用法演示出错: " + e.getMessage());
        }
    }
    
    /**
     * 演示链式调用
     */
    private static void demonstrateBuilderPattern(SparkConfig config) {
        System.out.println("\n--- 链式调用演示 ---");
        
        try {
            SparkClient client = SparkClient.builder(config)
                    .model("4.0Ultra")
                    .temperature(0.8)
                    .maxTokens(2048)
                    .systemMessage("你是一个专业的编程助手")
                    .userMessage("请解释什么是设计模式")
                    .stream(false)
                    .build();
            
            System.out.println("链式构建 SparkClient 成功");
            System.out.println("模型: " + client.getRequest().getModel());
            System.out.println("温度: " + client.getRequest().getTemperature());
            System.out.println("消息数量: " + client.getRequest().getMessages().size());
            System.out.println("流式模式: " + client.getRequest().getStream());
            
            // 打印消息内容
            client.getRequest().getMessages().forEach(message -> {
                System.out.println("- " + message.getRole() + ": " + message.getContent());
            });
            
        } catch (Exception e) {
            System.out.println("链式调用演示出错: " + e.getMessage());
        }
    }
    
    /**
     * 演示工具调用
     */
    private static void demonstrateToolCalling(SparkConfig config) {
        System.out.println("\n--- 工具调用演示 ---");
        
        try {
            // 创建工具调用处理器
            ToolCallHandler toolCallHandler = new ToolCallHandler();
            
            // 注册天气查询函数
            toolCallHandler.registerFunction("get_weather", params -> {
                String location = (String) params.get("location");
                String unit = (String) params.getOrDefault("unit", "celsius");
                
                // 模拟天气查询
                Map<String, Object> weather = new HashMap<>();
                weather.put("location", location);
                weather.put("temperature", 22);
                weather.put("unit", unit);
                weather.put("description", "晴朗");
                
                System.out.println("模拟查询天气: " + location + " -> " + weather);
                return weather;
            });
            
            // 创建天气查询工具定义
            Map<String, Object> properties = new HashMap<>();
            properties.put("location", ToolCallHandler.stringProperty("要查询天气的城市名称"));
            properties.put("unit", ToolCallHandler.enumProperty("温度单位", new String[]{"celsius", "fahrenheit"}));
            
            SparkTool weatherTool = ToolCallHandler.createFunctionTool(
                "get_weather", 
                "查询指定城市的天气信息", 
                properties, 
                new String[]{"location"}
            );
            
            // 创建带工具的客户端
            SparkClient client = SparkClient.builder(config)
                    .systemMessage("你是一个天气助手，可以查询天气信息")
                    .userMessage("北京今天天气怎么样？")
                    .tool(weatherTool)
                    .build();
            
            System.out.println("创建带工具的 SparkClient 成功");
            System.out.println("工具数量: " + client.getRequest().getTools().size());
            System.out.println("已注册的函数: " + toolCallHandler.getRegisteredFunctions());
            
            // 演示联网搜索工具
            SparkTool webSearchTool = SparkTool.webSearch(true, false, "normal");
            System.out.println("联网搜索工具: " + webSearchTool.getType());
            System.out.println("搜索模式: " + webSearchTool.getWebSearch().getSearchMode());
            
        } catch (Exception e) {
            System.out.println("工具调用演示出错: " + e.getMessage());
        }
    }
}
